EC2 Amazon LinuxにWAF(ModSecurity)をインストールする
昨日から突然不正・不要なHTTPアクセスが鬼のように増えてしまったので何か対策を打たねばという事から、mod_securityを適用することにしました。早速modsecurity-apache_2.6.6をダウンロードし、インストールを試みました
cd /usr/local/src wget http://sourceforge.net/projects/mod-security/files/modsecurity-apache/2.6.6/modsecurity-apache_2.6.6.tar.gz/download tar xvfz modsecurity-apache_2.6.6.tar.gz cd modsecurity-apache_2.6.6 ./configure configure: *** pcre library not found. configure: error: pcre library is required
と早速PCREがないと怒られました。
rpm -qa | grep pcre pcre-7.8-3.1.8.amzn1.x86_64
古いかもしれないので、アップデートをやってみる。
yum -y update pcre pcre.x86_64 0:8.21-5.2.amzn1
になりました。で再度実行しましたが、やっぱりこれだけではダメでした。依存するパッケージを追加でインストールします。
yum -y install pcre-devel yum -y install libxml2 yum -y install libxml2-devel
mod_securityを利用するにはmod_unique_idが必要ということでしたので、インストールします。
cd /usr/local/src/httpd-2.2.22/modules/metadata /usr/local/apache2/bin/apxs -cia mod_unique_id.c
次にaprとapr-utilをインストールします。
cd /usr/local/src/httpd-2.2.22/srclib/apr ./configure make make install cd /usr/local/src/httpd-2.2.22/srclib/apr-util ./configure --with-apr=/usr/local/apr/bin/apr-1-config make make install
ここまで出来たらpcre,apr,apr-utilに対応させるためにApacheの再構築を行います。
service httpd stop cd /usr/local/src/ cd httpd-2.2.22 make clean ./configure --enable-so \ --enable-rewrite \ --enable-mods-shared="unique_id" \ --with-pcre \ --with-apr=/usr/local/apr/bin/apr-1-config \ --with-apr-util=/usr/local/apr/bin/apu-1-config \ --prefix=/usr/local/apache2 make make install
よし、Apacheの再構築も終わったし、modsecurityのインストールに再チャレンジします
cd /usr/local/src/modsecurity-apache_2.6.6 make clean ./configure \ --prefix=/usr/local/apache2 \ --with-apxs=/usr/local/apache2/bin/apxs \ --with-apr=/usr/local/apache2/bin/apr-1-config \ --with-apu=/usr/local/apache2/bin/apu-1-config \ --with-pcre=/usr/bin/pcre-config \ --with-libxml=/usr/bin/xml2-config \ LDFLAGS=-L/usr/local/apache2/lib make make install
すると次は以下のエラーが出てしまいました。も〜ってな感じですが。。。
curl/curl.h: No such file or directory
う~んCURLなんて使うのか。。。
仕方ないので、
wget http://curl.haxx.se/download/curl-7.26.0.tar.gz
でダウンロード&インストールします
cd /usr/local/src wget http://curl.haxx.se/download/curl-7.26.0.tar.gz tar xvfz curl-7.26.0.tar.gz cd curl-7.26.0 ./configure make make install
curlのインストールがうまくいったので、modsecurityのインストールに再々チャレンジします
cd /usr/local/src cd modsecurity-apache_2.6.6 make clean ./configure \ --prefix=/usr/local/apache2 \ --with-apxs=/usr/local/apache2/bin/apxs \ --with-apr=/usr/local/apache2/bin/apr-1-config \ --with-apu=/usr/local/apache2/bin/apu-1-config \ --with-pcre=/usr/bin/pcre-config \ --with-libxml=/usr/bin/xml2-config \ LDFLAGS=-L/usr/local/apache2/lib make make install
ようやくエラーもなくmodsecurityがインストールできました。
次はmodsecurityで使用するテンポラリディレクトリを作成します。(Apacheの実行ユーザがapacheを想定しています。)
mkdir /var/modsecurity/ mkdir /var/modsecurity/data mkdir /var/modsecurity/tmp mkdir /var/modsecurity/upload chown root:apache /var/modsecurity chown apache:root /var/modsecurity/data chown apache:apache /var/modsecurity/tmp chown apache:root /var/modsecurity/upload/ chmod 750 /var/modsecurity chmod 700 /var/modsecurity/data chmod 750 /var/modsecurity/tmp chmod 700 /var/modsecurity/upload
次はCRS(Core Rule Set)をダウンロードしてセットアップします。
cd /usr/local/src wget http://sourceforge.net/projects/mod-security/files/modsecurity-crs/0-CURRENT/modsecurity-crs_2.2.5.tar.gz/download tar xvfz modsecurity-crs_2.2.5.tar.gz cd modsecurity-crs_2.2.5 mkdir /usr/local/apache2/crs cp -r /usr/local/src/modsecurity-crs_2.2.5/* crs/. cd /usr/local/apache2/crs cp modsecurity_crs_10_setup.conf.example modsecurity_crs_10_config.conf vi modsecurity_crs_10_config.conf
modsecurity_crs_10_config.confの29行目辺りに以下を追加します。
SecRuleEngine On # SecRequestBodyAccess リクエストボディのチェックを有効にする(必須) SecRequestBodyAccess On SecResponseBodyAccess Off # SecRequestBodyLimit はPOSTサイズの上限。 SecRequestBodyLimit 5242880 # SecRequestBodyNoFilesLimit はファイルアップロード以外のPOSTサイズの上限。 SecRequestBodyNoFilesLimit 51200 SecAuditEngine RelevantOnly SecAuditLogRelevantStatus "^(?:5|4(?!04))" SecAuditLogType Serial SecAuditLog logs/modsec_audit.log SecAuditLogParts "ABIFHKZ" SecDebugLog logs/modsec_debug.log SecDebugLogLevel 3 SecDataDir /var/modsecurity/data/ SecTmpDir /var/modsecurity/tmp/ SecUploadDir /var/modsecurity/upload/
modsecurity用のconfファイルを作成します。
touch /usr/local/apache2/conf/extra/httpd-modsecurity.conf
以下の内容を記述します。
LoadModule unique_id_module modules/mod_unique_id.so LoadModule security2_module modules/mod_security2.so Include crs/modsecurity_crs_10_config.conf Include crs/base_rules/*.conf
Apacheを再起動して、modsecurityが正しく起動され、APR,PCRE,LIBXMLがロードされていることを確認します。
service httpd stop service httpd start cd /usr/local/apache2/log cat error_log | grep APR [Wed Jun 20 11:38:56 2012] [notice] ModSecurity: APR compiled version="1.4.5"; loaded version="1.4.5" cat error_log | grep PCRE [Wed Jun 20 11:38:56 2012] [notice] ModSecurity: PCRE compiled version="8.21"; loaded version="8.21 2011-12-12 cat error_log | grep LIBXML [Wed Jun 20 11:38:56 2012] [notice] ModSecurity: LIBXML compiled version="2.7.6"
どうやら問題なくロードされているようです。
次に、正常系のアクセスを確認してみます。以下のURLはサンプルですので、環境に応じて変更してください。
http://ec2-[サーバホスト名称].compute.amazonaws.com/phpinfo.php
次にmod_securityによりブロックされることを確認します。先ほどのURLの後ろに、「?union+select」をつけてアクセスしてます。
http://ec2-[サーバホスト名称].compute.amazonaws.com/phpinfo.php?union+select
上記の画面の様に403 Forbiddenのエラーが表示されれば、mod_securityが稼働していることになります。これでだいぶ不正なアクセスは減ったのですが、やはりapacheのaccessログにはまだまだ不正・不要なリクエストが来ています。もしかしてこのIPアドレス自体が呪われているのではないか?という事になりElastic IPを振り直すことにしてみました。その結果、不要なリクエストがまったく飛んでこなくなりました。根本的な解決方法ではないかもしれませんが、AWSを利用していることもあり、簡単にIPアドレスを振り直すことができたので、暫定対策としてElastic IPを振り直すでまずは逃れることにします。
あと試してみることとしてはIPアドレスでのリクエストを遮断する設定をapacheに追加して設定してみたりですが、IP変更後、不正・不要なアクセスがこないのでこの設定がどこまで有効なのかは現時点では確認できませんが、一応apacheの設定に追加しておきました。
cd /usr/local/apache2/conf vi httpd.conf
下記をhttpd.confに追加しました。追加後はapacheを再起動します。ServerNameのxxx-xxx-xxx-xxxは適宜変更してください。
<VirtualHost *:80> ServerName any DocumentRoot /tmp </VirtualHost> <VirtualHost *:80> ServerName ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com DocumentRoot /usr/local/apache2/htdocs ErrorLog logs/error_log CustomLog logs/access_log combined env=!nolog </VirtualHost>